﻿Public Class xtf_ABMventa

    Dim ulg_row As DataRow
    Dim obj_documento As cls_documento_ = Nothing
    Dim dtt_documentodetalle_ As DataTable
    Dim dtt_documentoalteracion_ As DataTable
    Dim dtt_pie_ As DataTable

    Dim iva1 As Decimal
    Dim iva2 As Decimal

    Public Sub New()
        InitializeComponent()

        'Cargarmoneda()
        dtt_pie_ = New DataTable
        dtt_pie_.Columns.Add("Nombre", GetType(String))
        dtt_pie_.Columns.Add("Valor", GetType(String))
        dtt_pie_.Columns.Add("Total", GetType(Decimal))

 
        'Prepara grid y datasource proveedorarticulo----------------------------------------------------
        gdv_documentodetalle_.Tag = New Collections.Generic.List(Of cls_documentodetalle_)
        dtt_documentodetalle_ = New DataTable
        dtt_documentodetalle_.Columns.Add("idarticulo", GetType(Integer))
        'dtt_documentodetalle_.Columns.Add("cantidadMASK", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("Nombre", GetType(String))
        dtt_documentodetalle_.Columns.Add("Rubro", GetType(String))
        dtt_documentodetalle_.Columns.Add("RubroOrden", GetType(String))
        dtt_documentodetalle_.Columns.Add("Cantidad", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("Valor", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("I.V.A.", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("Descuento", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("Recargo", GetType(Decimal))
        dtt_documentodetalle_.Columns.Add("Total", GetType(Decimal))

        'dtt_documentodetalle_.Columns.Add("valorMASK", GetType(String))
        'dtt_documentodetalle_.Columns.Add("totalMASK", GetType(String))
        dtt_documentodetalle_.Columns.Add("Objeto", GetType(Object))

        gdc_documentodetalle_.DataSource = dtt_documentodetalle_
        gdc_documentodetalle_.ForceInitialize()
        gdv_documentodetalle_.PopulateColumns()
        gdv_documentodetalle_.Columns("Objeto").Visible = False
        gdv_documentodetalle_.Columns("idarticulo").Visible = False
        gdv_documentodetalle_.Columns("RubroOrden").Visible = False

        gdv_documentodetalle_.Columns("Nombre").OptionsColumn.AllowEdit = False
        gdv_documentodetalle_.Columns("Rubro").OptionsColumn.AllowEdit = False
        gdv_documentodetalle_.Columns("Valor").OptionsColumn.AllowEdit = False
        gdv_documentodetalle_.Columns("Total").OptionsColumn.AllowEdit = False

        gdv_documentodetalle_.Columns("I.V.A.").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_documentodetalle_.Columns("I.V.A.").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far

        gdv_documentodetalle_.Columns("I.V.A.").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit

        gdv_documentodetalle_.Columns("Nombre").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemMemoEdit
        gdv_documentodetalle_.Columns("Cantidad").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
        gdv_documentodetalle_.Columns("Descuento").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
        gdv_documentodetalle_.Columns("Recargo").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit

        gdv_documentodetalle_.Columns("Rubro").FieldNameSortGroup = "RubroOrden"
        gdv_documentodetalle_.Columns("Rubro").Group()

        gdv_documentodetalle_.ExpandAllGroups()
        Cargarcliente_()
        Cargartransporte_()
        Cargarformapago_()

        FiltrarColumnas()
        dtp_Fecha.DateTime = Now
        AgregarValidaciones()

        Dim parametro As New cls_config_parametro_
        iva1 = CDec(parametro.Buscar("iva1").valor)
        iva2 = CDec(parametro.Buscar("iva2").valor)
        lci_NoVal_Iva1.Text = "I.V.A. " & iva1 & "%:"
        lci_NoVal_Iva2.Text = "I.V.A. " & iva2 & "%:"

        If Not CBool(parametro.Buscar("modificarObs").valor) Then
            txt_descripcion.Properties.ReadOnly = True
        End If
        If Not CBool(parametro.Buscar("modificarfecha").valor) Then
            dtp_Fecha.Properties.ReadOnly = True
        End If

    End Sub

    Public Overrides Sub CargarObjetos()

    End Sub

    Private Sub Cargarcliente_()
        Dim tmp_obj As Integer = 0
        tmp_obj = cbo_cliente.EditValue
        Dim cliente_ As New cls_cliente_
        cliente_.CargarTodos(True)
        cargarCombo(cbo_cliente, cliente_.Items)
        cbo_cliente.EditValue = IIf(tmp_obj <> 0, tmp_obj, cbo_cliente.EditValue)
    End Sub
    Private Sub Cargartransporte_()
        Dim tmp_obj As Integer = 0
        tmp_obj = cbo_transporte.EditValue
        Dim transporte_ As New cls_transporte_
        transporte_.CargarTodos()
        cargarCombo(cbo_transporte, transporte_.Items)
        cbo_transporte.EditValue = IIf(tmp_obj <> 0, tmp_obj, cbo_transporte.EditValue)
    End Sub
    Private Sub Cargarformapago_()
        Dim tmp_obj As Integer = 0
        tmp_obj = cbo_formapago.EditValue
        Dim formapago_ As New cls_formapago_
        formapago_.CargarTodos()
        cargarCombo(cbo_formapago, formapago_.Items)
        cbo_formapago.EditValue = IIf(tmp_obj <> 0, tmp_obj, cbo_formapago.EditValue)
    End Sub
    Public Shadows Sub Nuevo(ByRef listado As Form)
        Try
            frm_listado = listado
            Me.Text = CType(frm_listado, xtf_ListadoBase).lbl_modulo.Text & " - Nuevo"
            obj_documento = New cls_documento_
            btn_Registro.Enabled = False

            'Numeracion por parametro
            Dim parametro As New cls_config_parametro_
            parametro.Buscar("proximoNumeroVenta")
            txt_numero.Text = parametro.valor
            parametro.Buscar("ptovto")
            txt_ptoventa.Text = parametro.valor
            dtp_Fecha.DateTime = Now.Date
            dte_vencimiento.DateTime = dtp_Fecha.DateTime
            dte_vencimientore.DateTime = dtp_Fecha.DateTime

            Me.Show()
        Catch ex As Exception
            'Dim frmError As New frm_ErrorManager(ex.Message)
        End Try
    End Sub

    Public Shadows Sub Modificar(ByRef documento As cls_documento_, ByRef listado As Form, ByRef row As DataRow)
        If IsNothing(obj_documento) Then
            obj_documento = New cls_documento_
        End If
        obj_documento = documento
        frm_listado = listado
        ulg_row = row : bbi_imprimir.Enabled = True

        Me.Text = CType(frm_listado, xtf_ListadoBase).lbl_modulo.Text & " - " & obj_documento.ToString
        txt_ID.Text = obj_documento.iddocumento
        'cbo_tipo.SelectedIndex = obj_documento.tipo
        dtp_Fecha.DateTime = obj_documento.fecha
        txt_numero.Text = obj_documento.numero
        txt_ptoventa.Text = obj_documento.puntoventa
        txt_observaciones.Text = obj_documento.observaciones
        If Not IsNothing(obj_documento.tercero) Then
            Dim cliente As New cls_cliente_
            cliente.BuscarXidtercero(obj_documento.idtercero)
            cbo_cliente.EditValue = cliente.idcliente
        End If

        cbo_transporte.EditValue = documento.idtransporte
        txt_direccion.Text = obj_documento.direccion
        cbo_documentotipo.Text = EnumDescription(obj_documento.tipo)

        cbo_formapago.EditValue = obj_documento.idformapago
        dte_vencimiento.DateTime = obj_documento.vencimiento
        dte_vencimientore.DateTime = obj_documento.vencimientore

    

        If Not IsNothing(obj_documento.documentorelacion_) Then
            For Each documentorelacion As cls_documento_ In obj_documento.documentorelacion_.Items
                If documentorelacion.tipodocumento = cls_documento_.enu_tipodocumento.Remito Then
                    If txt_remitos.Text <> "" Then txt_remitos.Text &= " // "
                    txt_remitos.Text &= Format(documentorelacion.numero, "00000000")
                End If
                If documentorelacion.tipodocumento = cls_documento_.enu_tipodocumento.PedidoCliente Then
                    If txt_pedidos.Text <> "" Then txt_pedidos.Text &= " // "
                    txt_pedidos.Text &= Format(documentorelacion.numero, "00000000")
                End If
            Next
        End If

        Dim parametro As New cls_config_parametro_
        parametro.Buscar("rubroPrincipal")
        Dim nombreRubroPrincipal As String = parametro.valor

        dtt_documentodetalle_.Clear()
        gdv_documentodetalle_.Tag.Clear()
        If Not IsNothing(obj_documento.documentodetalle_) Then
            If Not IsNothing(obj_documento.documentodetalle_.Items) Then
                For Each documentodetalle As cls_documentodetalle_ In obj_documento.documentodetalle_.Items
                    Dim Item As DataRow = dtt_documentodetalle_.NewRow
                    Item("Objeto") = documentodetalle
                    Item("idarticulo") = documentodetalle.idarticulo
                    Item("Nombre") = documentodetalle.nombre
                    If Not IsNothing(documentodetalle.articulo) Then
                        Item("Rubro") = documentodetalle.articulo.articulorubro.ToString
                    Else
                        Item("Rubro") = ""
                    End If
                    Item("I.V.A.") = documentodetalle.alteracionP
                    If Not IsNothing(documentodetalle.articulo) Then
                        If nombreRubroPrincipal = documentodetalle.articulo.articulorubro.idarticulorubro Then
                            Item("RubroOrden") = "0" & documentodetalle.articulo.articulorubro.ToString
                        Else
                            Item("RubroOrden") = documentodetalle.articulo.articulorubro.ToString
                        End If
                    End If

                    If documentodetalle.idunidaddetalle = 0 Then
                        Item("Valor") = documentodetalle.valor
                        Item("Cantidad") = documentodetalle.cantidad
                    Else
                        Item("Valor") = documentodetalle.valor
                        Item("Cantidad") = documentodetalle.cantidad
                    End If
                    Item("Descuento") = documentodetalle.descuentoP
                    Item("Recargo") = documentodetalle.recargoP

                    Item("Total") = documentodetalle.valorfinal

                    'Item("cantidadMASK") = documentodetalle.cantidad
                    'Item("valorMASK") = documento.moneda.simbolo & " " & documentodetalle.valor
                    'Item("totalMASK") = documento.moneda.simbolo & " " & Item("Total")
                    dtt_documentodetalle_.Rows.Add(Item)
                Next
            End If
        End If
        calcularTotales()

        txt_TDescuento.Text = obj_documento.descuento
        txt_TDescuentoP.Text = obj_documento.descuentoP
        txt_TRecargo.Text = obj_documento.recargo
        txt_TRecargoP.Text = obj_documento.recargoP

        gdv_documentodetalle_.ExpandAllGroups()

        'txt_Descuento.Text = Math.Round(obj_documento.descuento, int_cantdecimales)
        'txt_DescuentoP.Text = Math.Round(obj_documento.descuentoP, int_cantdecimales)
        'txt_Recargo.Text = Math.Round(obj_documento.recargo, int_cantdecimales)
        'txt_RecargoP.Text = Math.Round(obj_documento.recargoP, int_cantdecimales)


        btn_Registro.Enabled = True

        obj_documento.moneda = Nothing
        obj_documento.tercero = Nothing
        obj_documento.documentodetalle_ = Nothing
        obj_documento.registro = Nothing
        obj_documento.asiento = Nothing
        'btn_filtrar_Click(Nothing, Nothing)
        'btn_filtrar.Enabled = True

        Me.Show()

    End Sub

    Public Overrides Function ComprobarDatos() As Boolean
        'If cbo_moneda.Enabled = False Then
        '    ErrManagerShow("001015")
        '    Return False
        'End If
        If Not cbo_cliente.Enabled Then
            ErrManagerShow("001027", Me)
            Return False
        End If
        'If Not cbo_condicioniva.Enabled Then
        '    Return False
        'End If
        If Not ControlarValidaciones() Then
            ErrManagerShow("000004", Me)
            Return False
        End If
        Return True
    End Function

    Public Shadows Sub btn_Guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Guardar.Click
        If ComprobarDatos() Then

            obj_documento.tipodocumento = cls_documento_.enu_tipodocumento.Venta
            obj_documento.tipo = cls_documento_.enu_tipo.X
            obj_documento.fecha = dtp_Fecha.DateTime
            obj_documento.puntoventa = 0
            obj_documento.numero = txt_numero.Text
            obj_documento.idtransporte = cbo_transporte.EditValue
            obj_documento.puntoventa = txt_ptoventa.Text
            obj_documento.observaciones = txt_observaciones.Text
            obj_documento.razonsocial = cbo_cliente.Text
            obj_documento.direccion = txt_direccion.Text
            If cbo_cliente.EditValue <> 0 Then
                Dim cliente As New cls_cliente_
                cliente.Buscar(cbo_cliente.EditValue)
                obj_documento.idtercero = cliente.idtercero
            Else
                obj_documento.idtercero = 0
            End If

            obj_documento.idcondicioniva = 0 'CType(cbo_condicioniva.SelectedItem, cls_condicioniva_).idcondicioniva

            Dim moneda As New cls_moneda_
            moneda.MonedaLocal()
            obj_documento.idmoneda = moneda.idmoneda
            'obj_documento.cotizacionfecha = dpt_cotizacionfecha.DateTime
            'obj_documento.cotizacionvalor = txt_cotizacionvalor.Text

            obj_documento.descuento = txt_TDescuento.Text
            obj_documento.descuentoP = txt_TDescuentoP.Text
            obj_documento.recargo = txt_TRecargo.Text
            obj_documento.recargoP = txt_TRecargoP.Text

            Select Case cbo_documentotipo.Text
                Case EnumDescription(cls_documento_.enu_tipo.A)
                    obj_documento.tipo = cls_documento_.enu_tipo.A
                Case EnumDescription(cls_documento_.enu_tipo.B)
                    obj_documento.tipo = cls_documento_.enu_tipo.B
                Case EnumDescription(cls_documento_.enu_tipo.C)
                    obj_documento.tipo = cls_documento_.enu_tipo.C
            End Select

            obj_documento.idformapago = cbo_formapago.EditValue
            obj_documento.vencimiento = dte_vencimiento.DateTime
            obj_documento.vencimientore = dte_vencimientore.DateTime

            'Guardo documentodetalle------------------------------------------------------
            If IsNothing(obj_documento.documentodetalle_) Then
                obj_documento.documentodetalle_ = New cls_documentodetalle_
            End If
            If IsNothing(obj_documento.documentodetalle_.Items) Then
                obj_documento.documentodetalle_.Items = New Collections.Generic.List(Of cls_documentodetalle_)
            End If
            obj_documento.documentodetalle_.Items = New Collections.Generic.List(Of cls_documentodetalle_)
            For Each Elemento As DataRow In dtt_documentodetalle_.Rows
                Dim documentodetalle As cls_documentodetalle_ = Elemento("Objeto")
                If documentodetalle.cantidad = 0 Then
                    gdv_documentodetalle_.Tag.add(documentodetalle)
                Else
                    obj_documento.documentodetalle_.Items.Add(Elemento("Objeto"))
                End If
            Next
            For Each Elemento As cls_documentodetalle_ In gdv_documentodetalle_.Tag
                If Elemento.iddocumentodetalle <> 0 Then
                    Elemento.Eliminar(Elemento.iddocumentodetalle)
                End If
            Next

            'Crea asiento cuenta corriente---------------------------------------------------------
            If IsNothing(obj_documento.asiento) Then
                obj_documento.asiento = New cls_asiento_
            End If
            'obj_documento.asiento.importe = txt_totaltotal.Text
            obj_documento.asiento.tipoimporte = cls_asiento_.enu_tipoimporte.Ingreso
            obj_documento.asiento.fecha = obj_documento.fecha.Date
            obj_documento.asiento.idtercero = obj_documento.idtercero
            obj_documento.asiento.vencimiento = dte_vencimiento.DateTime
            obj_documento.asiento.vencimientoRE = dte_vencimientore.DateTime
            obj_documento.asiento.importe = txt_TTotal.Text

            Dim parametroConcepto As New cls_config_parametro_
            parametroConcepto.Buscar("conceptoCtaCteVenta")
            obj_documento.asiento.idasientoconcepto = IIf(parametroConcepto.valor = "", 0, parametroConcepto.valor)
            '--------------------------------------------------------------------------------------

            If txt_ID.Text = "" Then
                obj_documento.Nuevo(True)

                'Incrementa numeracion en parametro
                Dim parametro As New cls_config_parametro_
                parametro.Buscar("proximoNumeroCompra")
                parametro.valor += 1
                parametro.Modificar(parametro)

                If frm_listado.Visible Then
                    ulg_row = CType(frm_listado, xtf_LISTADOventa_).AgregarItem(obj_documento)
                End If
                Modificar(obj_documento, frm_listado, ulg_row)
            Else
                obj_documento.Modificar()
                If frm_listado.Visible Then
                    CType(frm_listado, xtf_LISTADOventa_).ModificarItem(obj_documento, ulg_row)
                End If
                Modificar(obj_documento, frm_listado, ulg_row)
            End If
            flg_Modificado = False : btn_Guardar.Enabled = False : bbi_guardar.Enabled = False
        End If
    End Sub

    Private Sub btn_Registro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Registro.Click
        If Not IsNothing(obj_documento.registro) Then
            Dim ABMRegistro As New xtf_ABMRegistro(obj_documento.registro)
            If ABMRegistro.ShowDialog() = Windows.Forms.DialogResult.OK Then
                flg_Modificado = True
            End If
        End If
    End Sub

    Private Sub btn_Cerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Cerrar.Click

        If flg_Modificado Then
            bol_comprobarCerrado = False
            Select Case ErrManagerShow("000001", Me)
                Case Windows.Forms.DialogResult.Yes
                    If ComprobarDatos() Then
                        btn_Guardar_Click(Nothing, Nothing)
                    Else
                        Exit Sub
                    End If
                Case Windows.Forms.DialogResult.Cancel : bol_comprobarCerrado = True
                    Exit Sub
            End Select
        End If
        guardar_config_usuariocolumna_()
        Me.Dispose()
    End Sub


    Private Sub txt_numero_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txt_numero.GotFocus
        txt_numero.SelectAll()
    End Sub

    Private Sub cbo_cliente_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo_cliente.EditValueChanged
        Dim cliente As New cls_cliente_
        If cliente.Buscar(cbo_cliente.EditValue) Then
            txt_telefono1.Text = ""
            txt_telefono2.Text = ""
            txt_direccion.Text = ""
            txt_localidad.Text = ""
            txt_condicioniva.Text = ""
            txt_numerofiscal.Text = ""

            'Dim lista As New cls_listaprecio_
            'lista.CargarXidcliente(cliente.idcliente)
            'cargarCombo(cbo_listaPrecio, lista.Items)
            'cbo_listaPrecio_EditValueChanged(Nothing, Nothing)
            opt_listaPreciotipo_SelectedIndexChanged(Nothing, Nothing)

            cbo_documentotipo.Properties.Items.Clear()
            If Not IsNothing(cliente.tercero.condicioniva) Then
                txt_condicioniva.Text = cliente.tercero.condicioniva.ToString
                If CType(cliente.tercero.condicioniva, cls_condicioniva_).documentoA Then cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.A))
                If CType(cliente.tercero.condicioniva, cls_condicioniva_).documentoB Then cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.B))
                If CType(cliente.tercero.condicioniva, cls_condicioniva_).documentoC Then cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.C))
            Else
                cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.A))
                cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.B))
                cbo_documentotipo.Properties.Items.Add(EnumDescription(cls_documento_.enu_tipo.C))
            End If
            cbo_documentotipo.SelectedIndex = 0

            If Not IsNothing(cliente.tercero.direccionprimario) Then
                txt_direccion.Text = cliente.tercero.direccionprimario.ToString
                If Not IsNothing(cliente.tercero.direccionprimario.localidad) Then
                    txt_localidad.Text = cliente.tercero.condicioniva.ToString
                End If
            End If

            If Not IsNothing(cliente.tercero.telefono_) Then
                If Not IsNothing(cliente.tercero.telefono_.Items) Then
                    If Not IsNothing(cliente.tercero.telefono_.Items(0)) Then
                        txt_telefono1.Text = cliente.tercero.telefono_.Items(0).ToString
                        If cliente.tercero.telefono_.Items.Count > 1 Then
                            txt_telefono2.Text = cliente.tercero.telefono_.Items(1).ToString
                        End If
                    End If
                End If
            End If
            txt_numerofiscal.Text = cliente.tercero.numerofiscal
        End If
    End Sub

    Private Sub cargarArticulos(ByRef listaprecio As cls_listaprecio_)
        If Not IsNothing(dtt_documentodetalle_) Then
            gdv_documentodetalle_.BeginDataUpdate()
            dtt_documentodetalle_.BeginLoadData()
            For Each row As DataRow In dtt_documentodetalle_.Rows
                gdv_documentodetalle_.Tag.add(row("objeto"))
            Next
            dtt_documentodetalle_.Rows.Clear()

            Dim parametro As New cls_config_parametro_
            parametro.Buscar("rubroPrincipal")
            Dim nombreRubroPrincipal As String = parametro.valor

            If Not IsNothing(listaprecio.listaprecioarticulo_) Then
                If Not IsNothing(listaprecio.listaprecioarticulo_.Items) Then
                    For Each detalle As cls_listaprecioarticulo_ In listaprecio.listaprecioarticulo_.Items
                        If detalle.valor <> 0 Then
                            Dim row As DataRow = dtt_documentodetalle_.NewRow
                            row("idarticulo") = detalle.idarticulo
                            row("Nombre") = detalle.articulo.ToString

                            row("Cantidad") = 0
                            row("I.V.A.") = detalle.articulo.iva
                            row("Rubro") = detalle.articulo.articulorubro.ToString
                            If nombreRubroPrincipal = detalle.articulo.articulorubro.idarticulorubro Then
                                row("RubroOrden") = "0" & detalle.articulo.articulorubro.ToString
                            Else
                                row("RubroOrden") = detalle.articulo.articulorubro.ToString
                            End If
                            row("Valor") = detalle.valor
                            row("Recargo") = 0
                            row("Descuento") = 0
                            row("Total") = 0
                            Dim documentoDetalle As New cls_documentodetalle_
                            Dim moneda As New cls_moneda_
                            moneda.MonedaLocal()
                            documentoDetalle.idarticulo = detalle.idarticulo
                            documentoDetalle.valor = detalle.valor
                            documentoDetalle.recargoP = detalle.articulo.iva
                            documentoDetalle.idmoneda = moneda.idmoneda
                            row("Objeto") = documentoDetalle
                            dtt_documentodetalle_.Rows.Add(row)
                        End If
                    Next
                End If
            End If
            

            dtt_documentodetalle_.EndLoadData()
            gdv_documentodetalle_.EndDataUpdate()
            gdv_documentodetalle_.ExpandAllGroups()
        End If

    End Sub

    Private Sub cbo_listaPrecio_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo_listaPrecio.EditValueChanged
        If cbo_listaPrecio.EditValue <> 0 Then
            Dim lista As New cls_listaprecio_
            lista.Buscar(cbo_listaPrecio.EditValue)
            cargarArticulos(lista)
        Else
            If Not IsNothing(dtt_documentodetalle_) Then
                For Each row As DataRow In dtt_documentodetalle_.Rows
                    gdv_documentodetalle_.Tag.add(row("objeto"))
                Next
                dtt_documentodetalle_.Rows.Clear()
            End If
        End If
    End Sub

    Private Sub gdv_listaprecioarticulo__CellValueChanged(ByVal sender As Object, ByVal e As DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs) Handles gdv_documentodetalle_.CellValueChanged
        gdv_documentodetalle_.BeginDataUpdate()
        Select Case e.Column.FieldName
            Case "Cantidad"
                Dim row As DataRow = gdv_documentodetalle_.GetDataRow(e.RowHandle)
                Dim detalle As cls_documentodetalle_
                detalle = row("objeto")
                detalle.cantidad = row("Cantidad")
                detalle.Recalcular()
                row("Total") = detalle.valorfinal
                calcularTotales()
            Case "I.V.A."
                Dim row As DataRow = gdv_documentodetalle_.GetDataRow(e.RowHandle)
                Dim detalle As cls_documentodetalle_
                detalle = row("objeto")
                detalle.alteracionP = row("I.V.A.")
                detalle.Recalcular()
                row("Total") = detalle.valorfinal
                calcularTotales()
            Case "Descuento"
                Dim row As DataRow = gdv_documentodetalle_.GetDataRow(e.RowHandle)
                Dim detalle As cls_documentodetalle_
                detalle = row("objeto")
                detalle.descuentoP = row("Descuento")
                detalle.Recalcular()
                row("Total") = detalle.valorfinal
                calcularTotales()
            Case "Recargo"
                Dim row As DataRow = gdv_documentodetalle_.GetDataRow(e.RowHandle)
                Dim detalle As cls_documentodetalle_
                detalle = row("objeto")
                detalle.recargoP = row("Recargo")
                detalle.Recalcular()
                row("Total") = detalle.valorfinal
                calcularTotales()
        End Select
        gdv_documentodetalle_.EndDataUpdate()
    End Sub

    Private Sub calcularTotales()
        Dim tmp_subtotal As Decimal = 0
        Dim tmp_iva1 As Decimal = 0
        Dim tmp_iva2 As Decimal = 0
        Dim tmp_ivaX As Decimal = 0

        For Each row As DataRow In dtt_documentodetalle_.Rows
            Dim detalle As cls_documentodetalle_ = row("objeto")
            tmp_subtotal += detalle.valorfinal
            Select Case detalle.alteracionP
                Case iva1
                    tmp_iva1 += detalle.alteracion
                Case iva2
                    tmp_iva2 += detalle.alteracion
                Case Else
                    tmp_ivaX += detalle.alteracion
            End Select
        Next
        txt_TSubtotal.Text = tmp_subtotal
        txt_TIva1.Text = tmp_iva1
        txt_TIva2.Text = tmp_iva2

        txt_TDescuento.Text = 0
        txt_TRecargo.Text = 0
        'If tmp_ivaX <> 0 Then
        '    lci_NoVal_IvaX.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always
        'Else
        '    lci_NoVal_IvaX.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never
        'End If
        txt_TIvaOtros.Text = tmp_ivaX
        calcularTotal()
    End Sub

    Private Sub guardar_config_usuariocolumna_()
        gdv_documentodetalle_.OptionsFilter.AllowFilterEditor = False
        gdv_documentodetalle_.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never
        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(UsuarioLOG.idusuario, Me.Name) Then
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_documentodetalle_)
            obj_config_usuariocolumna_.Modificar()
        Else
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_documentodetalle_)
            obj_config_usuariocolumna_.idusuario = UsuarioLOG.idusuario
            obj_config_usuariocolumna_.modulo = Me.Name
            obj_config_usuariocolumna_.Nuevo()
        End If
    End Sub

    Public Sub FiltrarColumnas()
        Dim int_IDUsuario As Integer = UsuarioLOG.idusuario
        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        gdv_documentodetalle_.BeginUpdate()
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(int_IDUsuario, Me.Name) Then
            SetLayoutData(gdv_documentodetalle_, obj_config_usuariocolumna_.xml)
        End If

        PerzonalizarControl(gdc_documentodetalle_)
        gdv_documentodetalle_.OptionsFilter.AllowFilterEditor = False
        gdv_documentodetalle_.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never

        gdv_documentodetalle_.EndUpdate()
    End Sub

    Private Function GetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView) As Byte()
        Dim stream As New System.IO.MemoryStream()
        prm_GridView.SaveLayoutToStream(stream)
        Return stream.GetBuffer()
    End Function

    Private Sub SetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView, ByVal data As Byte())
        If data Is Nothing OrElse data.Length = 0 Then
            Return
        End If
        Dim stream As New System.IO.MemoryStream(data)
        Try
            prm_GridView.RestoreLayoutFromStream(stream)
        Catch ex As Exception
            Throw New Exception("Wrong data format", ex)
        End Try
    End Sub

  
    Private Sub btn_filtrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_filtrar.Click
        If btn_filtrar.Text = "Cargar por articulo" Then
            For Each row As DataRow In dtt_documentodetalle_.Rows
                gdv_documentodetalle_.Tag.add(row("objeto"))
            Next
            dtt_documentodetalle_.Rows.Clear()
            btn_filtrar.Text = "Cargar lista de precios"
            lcg_cargaporarticulo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always
        Else
            cbo_listaPrecio_EditValueChanged(Nothing, Nothing)
            lcg_cargaporarticulo.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never
            btn_filtrar.Text = "Cargar por articulo"
        End If
    End Sub

    Private Sub btn_buscarCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscarCliente.Click
        Dim buscar As xtf_buscardor = Nothing
        Dim Objeto_ As New cls_cliente_
        Objeto_.CargarTodosLISTA(True)
        buscar = New xtf_buscardor("Clientes", Objeto_, {"razonsocial|Razon Social", "TerceroDomicilio|Domicilio", "TerceroLocalidad|Localidad", "TerceroIva|Condicion de IVA"}, 0, "Razon Social")
        If buscar.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim cliente As cls_cliente_ = buscar.obj_resultado
            cbo_cliente.EditValue = buscar.obj_resultado.idcliente
        End If
    End Sub

    Private Sub chk_descrpcionmultilinea_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chk_descrpcionmultilinea.CheckedChanged
        If chk_descrpcionmultilinea.Checked Then
            NoVal_nombremultilinea.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always
        Else
            NoVal_nombremultilinea.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never
        End If
    End Sub

    Private Sub tsb_ComposicionBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsb_ComposicionBuscar.Click

        Dim lista As New cls_listaprecio_
        If lista.Buscar(cbo_listaPrecio.EditValue) Then
            Dim buscar As xtf_buscardor = Nothing
            buscar = New xtf_buscardor("Articulos", lista.listaprecioarticulo_, {"nombreArticulo|Articulo"})
            If buscar.ShowDialog() = Windows.Forms.DialogResult.OK Then
                Dim articulo As cls_articulo_ = buscar.obj_resultado.articulo
                txt_nombre.Tag = articulo
                txt_descripcion.Text = articulo.descripcion
                txt_nombre.Text = articulo.nombre
                'If Not IsNothing(txt_razonsocial.Tag) Then
                '    If cbo_moneda.SelectedIndex <> 0 Then
                '        txt_valor.Text = CType(cbo_unidaddetalle.SelectedItem, cls_unidaddetalle_).CValCargar(articulo.costo(cls_articulocomposicionarticulo_.enu_segunvalor.proveedor, CType(txt_razonsocial.Tag, cls_proveedor_).idproveedor) / CType(btn_cotizacionultima.Tag, cls_cotizacion_).valor)
                '    Else
                '        txt_valor.Text = CType(cbo_unidaddetalle.SelectedItem, cls_unidaddetalle_).CValCargar(articulo.costo(cls_articulocomposicionarticulo_.enu_segunvalor.proveedor, CType(txt_razonsocial.Tag, cls_proveedor_).idproveedor))
                '    End If
                'End If
                txt_valor.Text = buscar.obj_resultado.valor
                txt_iva.Text = articulo.iva

                txt_nombre.Properties.ReadOnly = True
                txt_nombre.Focus()
            End If
        Else
            Dim buscar As xtf_buscardor = Nothing
            Dim Objeto_ As New cls_articulo_
            Objeto_.CargarTodos()

            buscar = New xtf_buscardor("Articulos", Objeto_, {"nombre|Articulo"})

            If buscar.ShowDialog() = Windows.Forms.DialogResult.OK Then
                Dim articulo As cls_articulo_ = buscar.obj_resultado
                txt_nombre.Tag = articulo
                txt_descripcion.Text = articulo.descripcion
                txt_nombre.Text = articulo.nombre
                'If Not IsNothing(txt_razonsocial.Tag) Then
                '    If cbo_moneda.SelectedIndex <> 0 Then
                '        txt_valor.Text = CType(cbo_unidaddetalle.SelectedItem, cls_unidaddetalle_).CValCargar(articulo.costo(cls_articulocomposicionarticulo_.enu_segunvalor.proveedor, CType(txt_razonsocial.Tag, cls_proveedor_).idproveedor) / CType(btn_cotizacionultima.Tag, cls_cotizacion_).valor)
                '    Else
                '        txt_valor.Text = CType(cbo_unidaddetalle.SelectedItem, cls_unidaddetalle_).CValCargar(articulo.costo(cls_articulocomposicionarticulo_.enu_segunvalor.proveedor, CType(txt_razonsocial.Tag, cls_proveedor_).idproveedor))
                '    End If
                'End If
                txt_iva.Text = articulo.iva
                txt_nombre.Properties.ReadOnly = True
                txt_nombre.Focus()
            End If
        End If

        

    End Sub

    Private Sub tsb_documentodetalleAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsb_documentodetalleAgregar.Click
        Dim documentodetalle As New cls_documentodetalle_


        documentodetalle.nombre = txt_nombre.Text
        If NoVal_nombremultilinea.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always Then
            documentodetalle.descripcion = txt_descripcion.Text
        End If
        If Not IsNothing(txt_nombre.Tag) Then
            documentodetalle.idarticulo = CType(txt_nombre.Tag, cls_articulo_).idarticulo
            documentodetalle.codigo = CType(txt_nombre.Tag, cls_articulo_).codigo
            documentodetalle.idunidaddetalle = CType(txt_nombre.Tag, cls_articulo_).idunidad
        End If

        documentodetalle.descripcion = txt_descripcion.Text
        documentodetalle.nombre = txt_nombre.Text
        documentodetalle.cantidad = txt_cantidad.Text
        documentodetalle.valor = txt_valor.Text
        documentodetalle.descuentoP = txt_descuento.Text
        documentodetalle.recargoP = txt_recargo.Text
        documentodetalle.alteracionP = txt_iva.Text
        documentodetalle.Recalcular()

        Dim Item As DataRow = dtt_documentodetalle_.NewRow
        Item("Objeto") = documentodetalle
        Item("idarticulo") = documentodetalle.idarticulo
        Item("Nombre") = documentodetalle.nombre
        If NoVal_nombremultilinea.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always Then
            Item("Nombre") &= vbNewLine & documentodetalle.descripcion
        End If
        Item("Valor") = documentodetalle.valor
        Item("Cantidad") = documentodetalle.cantidad

        Item("Descuento") = documentodetalle.descuentoP
        Item("Recargo") = documentodetalle.recargoP
        Item("I.V.A.") = documentodetalle.alteracionP

        If Not IsNothing(documentodetalle.articulo) Then
            Dim parametro As New cls_config_parametro_
            parametro.Buscar("rubroPrincipal")
            Dim nombreRubroPrincipal As String = parametro.valor

            Item("Rubro") = documentodetalle.articulo.articulorubro.ToString
            If nombreRubroPrincipal = documentodetalle.articulo.articulorubro.idarticulorubro Then
                Item("RubroOrden") = "0" & documentodetalle.articulo.articulorubro.ToString
            Else
                Item("RubroOrden") = documentodetalle.articulo.articulorubro.ToString
            End If
        End If
        

        Item("Total") = documentodetalle.valorfinal '(Item("Cantidad") * Item("Valor")) - Item("Descuento") + Item("Recargo")
        'Item("cantidadMASK") = documentodetalle.cantidad
        'Item("valorMASK") = CType(cbo_moneda.SelectedItem, cls_moneda_).simbolo & " " & documentodetalle.valor
        'Item("totalMASK") = CType(cbo_moneda.SelectedItem, cls_moneda_).simbolo & " " & Item("total")
        dtt_documentodetalle_.Rows.Add(Item)

        txt_cantidad.Text = 1
        txt_nombre.Text = ""
        txt_nombre.Tag = Nothing
        txt_nombre.Properties.ReadOnly = False
        txt_descripcion.Text = ""
        txt_valor.Text = 0
        txt_total.Text = 0
        txt_iva.Text = 0
        txt_descuento.Text = 0
        txt_recargo.Text = 0
        calcularTotales()
        calcularTotal()

        txt_cantidad.Focus()
    End Sub

    Private Sub txt_cantidad_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_cantidad.EditValueChanged
        txt_total.Text = CDec(txt_cantidad.Text) * CDec(IIf(txt_valor.Text = "", 0, txt_valor.Text))
    End Sub

    Private Sub txt_valor_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_valor.EditValueChanged
        txt_total.Text = CDec(txt_cantidad.Text) * CDec(IIf(txt_valor.Text = "", 0, txt_valor.Text))
    End Sub

    Private Sub tsb_documentodetalleEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsb_documentodetalleEliminar.Click
        If gdv_documentodetalle_.SelectedRowsCount > 0 Then
            gdv_documentodetalle_.BeginDataUpdate()
            gdv_documentodetalle_.Tag.add(gdv_documentodetalle_.GetDataRow(gdv_documentodetalle_.GetSelectedRows(0))("Objeto"))
            dtt_documentodetalle_.Rows.Remove(gdv_documentodetalle_.GetDataRow(gdv_documentodetalle_.GetSelectedRows(0)))
            gdv_documentodetalle_.EndDataUpdate()
            calcularTotal()
        End If
    End Sub

    Private Sub txt_valor_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_valor.KeyPress
        If e.KeyChar = Chr(13) Then
            txt_iva.Focus()
        End If
    End Sub

    Private Sub txt_cantidad_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_cantidad.KeyPress
        If e.KeyChar = Chr(13) Then
            txt_nombre.Focus()
        End If
    End Sub

    Private Sub txt_nombre_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txt_nombre.KeyDown
        If e.KeyCode = Keys.F3 Then
            txt_nombre.PerformClick(txt_nombre.Properties.Buttons(0))
            Exit Sub
        End If

        If e.KeyCode <> Keys.Enter Then
            If Not IsNothing(txt_nombre.Tag) Then
                txt_nombre.Tag = Nothing
            End If
            txt_nombre.Properties.ReadOnly = False
        End If
    End Sub

    Private Sub txt_nombre_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_nombre.KeyPress
        If e.KeyChar = Chr(13) Then
            txt_valor.Focus()
        Else
            If Not IsNothing(txt_nombre.Tag) Then
                txt_nombre.Tag = Nothing
            End If
            txt_nombre.Properties.ReadOnly = False
        End If
    End Sub

    Private Sub txt_iva_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_iva.KeyPress
        If e.KeyChar = Chr(13) Then
            txt_descuento.Focus()
        End If
    End Sub

    Private Sub txt_descuento_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_descuento.KeyPress
        If e.KeyChar = Chr(13) Then
            txt_recargo.Focus()
        End If
    End Sub

    Private Sub txt_recargo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_recargo.KeyPress
        If e.KeyChar = Chr(13) Then
            tsb_documentodetalleAgregar.Focus()
            tsb_documentodetalleAgregar.PerformClick()
        End If
    End Sub

 Private Sub txt_nombre_ButtonClick(ByVal sender As Object, ByVal e As DevExpress.XtraEditors.Controls.ButtonPressedEventArgs) Handles txt_nombre.ButtonClick
        tsb_ComposicionBuscar_Click(Nothing, Nothing)
    End Sub


    Private Sub txt_Descuento_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_TDescuento.EditValueChanged
        If Not txt_TSubtotal.Text = 0 Then
            txt_TDescuentoP.EditValue = Math.Round((CDec(txt_TDescuento.EditValue) * 100) / CDec(txt_TSubtotal.EditValue), int_cantdecimales)
            calculartotal()
        End If
    End Sub

    Private Sub txt_DescuentoP_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_TDescuentoP.EditValueChanged
        txt_TDescuento.EditValue = Math.Round((CDec(txt_TDescuentoP.EditValue) * CDec(txt_TSubtotal.EditValue)) / 100, int_cantdecimales)
        calculartotal()
    End Sub

    Private Sub txt_Recargo_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_TRecargo.EditValueChanged
        If Not txt_TSubtotal.Text = 0 Then
            txt_TRecargoP.Text = Math.Round((CDec(txt_TRecargo.EditValue) * 100) / CDec(txt_TSubtotal.EditValue), int_cantdecimales)
            calculartotal()
        End If
    End Sub

    Private Sub txt_RecargoP_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_TRecargoP.EditValueChanged
        txt_TRecargo.Text = Math.Round((CDec(txt_TRecargoP.EditValue) * CDec(txt_TSubtotal.EditValue)) / 100, int_cantdecimales)
        calculartotal()
    End Sub

    Private Sub cbo_formapago_EditValueChanging(ByVal sender As Object, ByVal e As DevExpress.XtraEditors.Controls.ChangingEventArgs) Handles cbo_formapago.EditValueChanging
        Dim formapago As New cls_formapago_
        If formapago.Buscar(cbo_formapago.EditValue) Then
            dte_vencimiento.DateTime = DateAdd(DateInterval.Day, formapago.dias, dtp_Fecha.DateTime).Date
            dte_vencimientore.DateTime = dte_vencimiento.DateTime
        End If

    End Sub

    Private Sub dtp_Fecha_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dtp_Fecha.EditValueChanged
        cbo_formapago_EditValueChanging(Nothing, Nothing)

    End Sub

    Private Sub calcularTotal()
        If txt_observaciones.Text = numeroToLetras(Replace(txt_TTotal.Text, ".", "")) Then txt_observaciones.Text = ""
        txt_TTotal.Text = CDec(txt_TSubtotal.EditValue) + CDec(txt_TIva1.EditValue) + CDec(txt_TIva2.EditValue) + CDec(txt_TIvaOtros.EditValue) + CDec(txt_TRecargo.EditValue) - CDec(txt_TDescuento.EditValue)
        If txt_observaciones.Text = "" Then txt_observaciones.Text = numeroToLetras(Replace(txt_TTotal.Text, ".", ""))
    End Sub

    Public Overrides Sub bbi_imprimir_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs)
        If txt_ID.Text <> "" Then
            Dim obj_command As New SqlClient.SqlCommand()
            Dim obj_Conexion As New cls_Conexion
            obj_Conexion.Conectar()
            With obj_command
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__reporte1"
                .Parameters.Add("@iddocumento", SqlDbType.Int).Value = txt_ID.Text
            End With
            Dim obj_Adapter As New SqlClient.SqlDataAdapter(obj_command)
            Dim dts_venta As New dts_venta
            obj_Adapter.Fill(dts_venta.Tables(0))

            Dim report As New xtr_REPORTEventa
            report.DataSource = dts_venta

            'report.lbl_nombre.Text = obj_ListaPrecio.nombre
            'report.lbl_numero.Text = "Lista Nº: " & obj_ListaPrecio.idlistaprecio

            obj_Conexion.Desconectar()
            'report.lblFecha.Text = dteFecha.ToShortDateString
            'report.lblFecha2.Text = dteFecha.ToShortDateString
            report.ShowPreview()
        End If
    End Sub

    Private Sub opt_listaPreciotipo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles opt_listaPreciotipo.SelectedIndexChanged
        Select Case opt_listaPreciotipo.SelectedIndex
            Case cls_listaprecio_.enu_tipo.Cliente
                Dim cliente As New cls_cliente_
                If cliente.Buscar(cbo_cliente.EditValue) Then
                    Dim lista As New cls_listaprecio_
                    lista.CargarXidcliente(cliente.idcliente)
                    cargarCombo(cbo_listaPrecio, lista.Items)
                    cbo_listaPrecio_EditValueChanged(Nothing, Nothing)
                End If
            Case cls_listaprecio_.enu_tipo.General
                Dim lista As New cls_listaprecio_
                lista.CargarXtipo(cls_listaprecio_.enu_tipo.General)
                cargarCombo(cbo_listaPrecio, lista.Items)
                cbo_listaPrecio_EditValueChanged(Nothing, Nothing)
        End Select
    End Sub
End Class
